package middleware

import (
	"strings"

	"github.com/gogf/gf/v2/net/ghttp"

	"goldtree/internal/service"
	"goldtree/utility/response"
)

// Auth 认证中间件
func Auth(r *ghttp.Request) {
	// 从请求头获取令牌
	token := getTokenFromRequest(r)
	if token == "" {
		response.ErrorExit(r, "未提供访问令牌")
		return
	}

	// 验证令牌
	user, err := service.User.ValidateToken(r.Context(), token)
	if err != nil {
		response.ErrorExit(r, "令牌验证失败: "+err.Error())
		return
	}

	// 将用户信息存储到上下文中
	r.SetCtxVar("user_id", user.Id)
	r.SetCtxVar("user", user)
	r.SetCtxVar("username", user.Username)
	r.SetCtxVar("user_role", user.Role)

	// 继续处理请求
	r.Middleware.Next()
}

// AdminAuth 管理员认证中间件
func AdminAuth(r *ghttp.Request) {
	// 先执行基础认证
	Auth(r)
	
	// 检查是否已经中止（基础认证失败）
	if r.Response.Status >= 400 {
		return
	}

	// 检查用户角色
	userRole := r.GetCtxVar("user_role")
	if userRole == nil || userRole.String() != "admin" {
		response.ErrorExit(r, "需要管理员权限")
		return
	}

	// 继续处理请求
	r.Middleware.Next()
}

// OptionalAuth 可选认证中间件（令牌存在则验证，不存在则跳过）
func OptionalAuth(r *ghttp.Request) {
	// 从请求头获取令牌
	token := getTokenFromRequest(r)
	if token == "" {
		// 没有令牌，直接继续处理
		r.Middleware.Next()
		return
	}

	// 验证令牌
	user, err := service.User.ValidateToken(r.Context(), token)
	if err != nil {
		// 令牌无效，但不中止请求，只是不设置用户信息
		r.Middleware.Next()
		return
	}

	// 将用户信息存储到上下文中
	r.SetCtxVar("user_id", user.Id)
	r.SetCtxVar("user", user)
	r.SetCtxVar("username", user.Username)
	r.SetCtxVar("user_role", user.Role)

	// 继续处理请求
	r.Middleware.Next()
}

// getTokenFromRequest 从请求头获取令牌
func getTokenFromRequest(r *ghttp.Request) string {
	// 从Authorization头获取
	authHeader := r.Header.Get("Authorization")
	if authHeader != "" {
		// Bearer Token格式: Bearer <token>
		parts := strings.SplitN(authHeader, " ", 2)
		if len(parts) == 2 && strings.ToLower(parts[0]) == "bearer" {
			return parts[1]
		}
	}
	
	// 从X-Token头获取
	token := r.Header.Get("X-Token")
	if token != "" {
		return token
	}
	
	// 从查询参数获取
	token = r.Get("token").String()
	if token != "" {
		return token
	}
	
	return ""
}